﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraBars;
using CTEM.Controllers.BUS;
using CTEM.Controllers.DAO;
using CTEM.Models;
using DevExpress.XtraGrid.Views.Base;
using CTEM.Controllers.Global;
using DevExpress.XtraEditors.DXErrorProvider;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid;
using DevExpress.XtraEditors;
using CTEM.ModuleForms.EmployeeManagement;

namespace CTEM.ModuleForms.ManageEmployee
{
    public partial class EmployeeManagement : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        private EmployeeBUS employeeBUS;
        private RoleBUS roleBus;
        private List<EmployerDTO> listEmployee;
        private List<EmployerDTO> historyList;
        private List<RoleDTO> listRole;
        private bool isNew;
        private bool isUpdate;
        private bool isEdit;
        public EmployeeManagement()
        {
            InitializeComponent();
            employeeBUS = new EmployeeBUS();
            roleBus = new RoleBUS();
            listEmployee = new List<EmployerDTO>();
            historyList = new List<EmployerDTO>();
            listRole = new List<RoleDTO>();
            isNew = false;
            isUpdate = false;
            
          
        }
        private void LoadAllEmployee()
        {
           
            listEmployee = employeeBUS.LoadAllEmployee();
            listRole = roleBus.GetWithoutAdmin();
            employerDTOBindingSource.DataSource = listEmployee;
            repositoryItemLookUpEdit1.DataSource = listRole;
            repositoryItemLookUpEdit1.DisplayMember = "RoleName";
            repositoryItemLookUpEdit1.ValueMember = "RoleID";
            
        }

        private void EmployeeManagement_Load(object sender, EventArgs e)
        {
     
            LoadAllEmployee();
            isEdit = false;
            
        }

        private void gridView1_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
        {
            isNew = true;
            gridView1.SetRowCellValue(e.RowHandle, "DOB", "01/01/1982");
            
        }

        private bool ValidateEmployee(EmployerDTO emp, out string output, out int i)
        {
            DateTime dt1 = new DateTime(1900, 01, 01);
            DateTime dt2 = DateTime.Now;
            i = 0;
            EmployerDAO emp1 = new EmployerDAO();
            if (String.IsNullOrEmpty(emp.Username))
            {
                output = "Xin hãy nhập tên đăng nhập";
                i = 0;
                return false;
            }
            else if (emp1.GetEmployerByUsername(emp.Username)!= null)
            {
                output = "Tên đăng nhập đã tồn tại";
                i = 0;
                return false;
            }
            else if (String.IsNullOrEmpty(emp.Fullname))
            {
                i = 1;
                output = "Xin hãy nhập tên đầy đủ";
                return false;
            }
            else if (DateTime.Compare(emp.DOB, dt1) < 0 || DateTime.Compare(emp.DOB, dt2) > 0)
            {
                output = "Ngày sinh không thể lớn hơn " + DateTime.Now.ToString("dd-MM-yyyy") + " hoặc bé hơn " + dt1.ToString("dd-MM-yyyy");
                i = 6;
                return false;
            }
            else if (emp.Fullname.Length > 50)
            {
                i = 1;
                output = "Tên đầy đủ không được quá 50 ký tự";
                return false;
            }
            else if (emp.Username.Length > 50)
            {
                i = 0;
                output = "Tên đăng nhập không được quá 50 ký tự";
                return false;
            }
            else if (emp.Address.Length > 250)
            {
                i = 3;
                output = "Địa chỉ không được quá 250 ký tự";
                return false;
            }
            output = "";
            return true;
        }

        private bool ValidateEmployeeUpdate(EmployerDTO emp, out string output, out int i)
        {
            DateTime dt1 = new DateTime(1900, 01, 01);
            DateTime dt2 = DateTime.Now;
            i = 0;
            EmployerDAO emp1 = new EmployerDAO();
            if (String.IsNullOrEmpty(emp.Username))
            {
                output = "Xin hãy nhập tên đăng nhập";
                i = 0;
                return false;
            }
          
            else if (String.IsNullOrEmpty(emp.Fullname))
            {
                i = 1;
                output = "Xin hãy nhập tên đầy đủ";
                return false;
            }
            else if (DateTime.Compare(emp.DOB, dt1) < 0 || DateTime.Compare(emp.DOB, dt2) > 0)
            {
                output = "Ngày sinh không thể lớn hơn " + DateTime.Now.ToString("dd-MM-yyyy") + " hoặc bé hơn " + dt1.ToString("dd-MM-yyyy");
                i = 6;
                return false;
            }
            else if (emp.Fullname.Length > 50)
            {
                i = 1;
                output = "Tên đầy đủ không được quá 50 ký tự";
                return false;
            }
            else if (emp.Username.Length > 50)
            {
                i = 0;
                output = "Tên đăng nhập không được quá 50 ký tự";
                return false;
            }
            else if (emp.Address.Length > 250)
            {
                i = 3;
                output = "Địa chỉ không được quá 250 ký tự";
                return false;
            }
            output = "";
            return true;
        }
      
        private void gridView1_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
      
            if (isNew)
            {
                //gridView1.OptionsBehavior.ReadOnly = false;
                ColumnView view = sender as ColumnView;
                EmployerDTO employee = new EmployerDTO();
                //gridView1.Columns["totalDebt"].OptionsColumn.AllowEdit = true;
                employee = e.Row as EmployerDTO;
                employee.Password = DataProvider.Encrypt(Constants.DEFAULT_PASSWORD);
                //Get RoleID by RoleName
                RoleDTO role = new RoleDTO();
                role = repositoryItemLookUpEdit1.GetDataSourceRowByDisplayValue(employee.RoleName) as RoleDTO;
                bool chk = true;
                if( employee.RoleID == 0)
                {
                    chk = false;
                    e.Valid = false;
                    view.ClearColumnErrors();
                    view.SetColumnError(view.Columns[2], "Xin hãy chọn chức vụ", ErrorType.Warning);
                    DialogResult result = MessageBox.Show("Xin hãy chọn chức vụ cho nhân viên.\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    if (result == DialogResult.No)
                    {
                        isNew = false;
                        e.Valid = true;
                        LoadAllEmployee();
                    }
                }
                if (chk)
                {
                    String message = null;
                    int pos = -1;
                    if (!ValidateEmployee(employee, out message, out pos))
                    {
                        //tempEmployee = employee;
                        e.Valid = false;
                        view.ClearColumnErrors();
                        view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                        DialogResult result = MessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        if (result == DialogResult.No)
                        {
                            isNew = false;
                            e.Valid = true;
                            LoadAllEmployee();
                        }
                    }
                    else
                    {
                        bool success = employeeBUS.CreateEmployee(employee);
                        if (!success)
                        {
                            e.Valid = false;
                            DialogResult result = MessageBox.Show("Bạn xem lại kết nối tới máy chủ \nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                            if (result == DialogResult.No)
                            {
                                isNew = false;
                                e.Valid = true;
                                LoadAllEmployee();
                            }
                           // gridView1.OptionsBehavior.ReadOnly = true;
                        }
                        else
                        {
                            alertControlMain.Show(this, Constants.CONFIRM, String.Format("Bạn Đã tạo mới thông tin cho nhân viên {0} Thành Công! ",employee.Fullname));
                            employee.status = 1;
                            historyList.Add(employee);
                            isNew = false;
                            LoadAllEmployee();
                            //gridView1.OptionsBehavior.ReadOnly = true;
                        }
                    }
                }


            }
        }

        private void gridView1_InvalidRowException(object sender, InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = ExceptionMode.NoAction;
        }

        private void gridView1_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {

            if (e.FocusedRowHandle == DevExpress.XtraGrid.GridControl.NewItemRowHandle)
            {

                gridView1.OptionsBehavior.ReadOnly = false;
           
            }
            else
            {
                gridView1.OptionsBehavior.ReadOnly = !isEdit;
            }
           
        }

        private void gridView1_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            if (!isNew)
            {
                ColumnView view = sender as ColumnView;
                int i = e.RowHandle;
                EmployerDTO employee = gridView1.GetRow(i) as EmployerDTO;
                EmployerDTO backUpEmployee = employeeBUS.GetEmployeeByEmployeeID(Convert.ToInt16(employee.employeeID));
                EmployerDTO testEmployee = employeeBUS.GetEmployeeByUserName(employee.Username);
                String message = "";
                int pos = -1;

                if (testEmployee == null)
                {
                    if (!ValidateEmployeeUpdate(employee, out message, out pos))
                    {
                        DialogResult result = MessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        view.ClearColumnErrors();
                        view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                        if (result == DialogResult.No)
                        {
                            isUpdate = false;
                            LoadAllEmployee();
                        }
                        else
                        {
                            isUpdate = true;
                            gridView1.FocusedRowHandle = i;
                            gridView1.FocusedColumn = e.Column;
                            return;
                        }
                    }
                }
                else if (testEmployee.employeeID == employee.employeeID)
                {
                    if (!ValidateEmployeeUpdate(employee, out message, out pos))
                    {
                        DialogResult result = MessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        view.ClearColumnErrors();
                        view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                        if (result == DialogResult.No)
                        {
                            isUpdate = false;
                            LoadAllEmployee();
                        }
                        else
                        {
                            isUpdate = true;
                            gridView1.FocusedRowHandle = i;
                            gridView1.FocusedColumn = e.Column;
                            return;
                        }
                    }
                }
                else 
                {
                      if (!ValidateEmployee(employee, out message, out pos))
                    {
                        DialogResult result = MessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        view.ClearColumnErrors();
                        view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                        if (result == DialogResult.No)
                        {
                            isUpdate = false;
                            LoadAllEmployee();
                        }
                        else
                        {
                            isUpdate = true;
                            gridView1.FocusedRowHandle = i;
                            gridView1.FocusedColumn = e.Column;
                            return;
                        }
                    }
                }
                
            
              
                if (!employeeBUS.UpdateEmployee(employee))
                {
                    MessageBox.Show("Không thể cập nhật thông tin nhân viên, bạn xem lại kết nối mạng với máy chủ", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    LoadAllEmployee();
                    isUpdate = false;
                  
                }
                else
                {
                    alertControlMain.Show(this, Constants.CONFIRM, String.Format("Bạn Đã sửa thông tin cho nhân viên {0} Thành Công! ", employee.Fullname));
                    isUpdate = false;
                    backUpEmployee.status = 2;
                    historyList.Add(backUpEmployee);
                   
                }
            }
            
        }

        private void btnUndo_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (historyList.Count > 0)
            {
                try
                {
                    EmployerDTO employee = historyList[historyList.Count - 1];
                    if (employee.status == 1)
                    {
                        employeeBUS.DeleteEmp(employee.Username);
                    }
                    else if (employee.status == 2)
                    {
                        employeeBUS.UpdateEmployee(employee);
                    }
                    else if (employee.status == 3)
                    {
                        employeeBUS.CreateEmployee(employee);
                    }
                }
                catch
                {
                    MessageBox.Show("Không thể hồi phục dữ liệu này");
                }
                historyList.RemoveAt(historyList.Count - 1);
            }
            LoadAllEmployee();
        }

        private void btnEdit_ItemClick(object sender, ItemClickEventArgs e)
        {
            gridView1.OptionsBehavior.ReadOnly = false;
           
            
        }

        private void repositoryItemButtonEdit1_ButtonClick(object sender, ButtonPressedEventArgs e)
        {
            int rowIndex = gridView1.FocusedRowHandle;
            var view = sender as ColumnView;
            var employee = gridView1.GetRow(rowIndex) as EmployerDTO;
            if (!isNew)
            {
                using (var advanceManagementForm = new DebtManagement(employee))
                {
                    advanceManagementForm.ShowDialog();

                }

            }
            else
                MessageBox.Show("Bạn Phải Khởi Tạo Nhân Viên Trước");

        }


     

    }
}